{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "id": "4Uf3Ua7OQXp8"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "from scipy.stats import poisson\n",
        "import matplotlib.pyplot as plt"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {},
      "outputs": [],
      "source": [
        "# x = np.arange(0, 100, 0.5) # creating a numpy array for x-axis\n",
        "# y = poisson.pmf(x, mu=40, loc=10) # # poisson distribution data for y-axis\n",
        "# plt.plot(x, y)\n",
        "# plt.show()\n",
        "\n",
        "def histogram(df, colname, num_bins=20, figscale=1):\n",
        "  df[colname].plot(kind='hist', bins=num_bins, title=colname, figsize=(8*figscale, 4*figscale))\n",
        "  plt.gca().spines[['top', 'right',]].set_visible(False)\n",
        "  plt.tight_layout()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "nNmQvt7sQXp-"
      },
      "source": [
        "# 发动机故障"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "id": "YxmqahI3QXqA"
      },
      "outputs": [],
      "source": [
        "def break_day(r):\n",
        "    if r <= 0.25:\n",
        "        return 4\n",
        "    elif r <= 0.75:\n",
        "        return 5\n",
        "    else:\n",
        "        return 6"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Ab268KQFQXqA",
        "outputId": "01c3e256-19a5-4eae-a46d-38c07e20a92d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "故障10次, 总运行天数50\n",
            "故障10次, 平均成本2200.0\n"
          ]
        }
      ],
      "source": [
        "days10 = [break_day(r) for r in np.random.rand(10)]\n",
        "print(f\"故障10次, 总运行天数{sum(days10)}\")\n",
        "print(f\"故障10次, 平均成本{110000.0 / sum(days10)}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "iyadYmHzQXqB",
        "outputId": "a5661c78-7929-45af-97f3-8f5b942b9449"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "天数 均值 4.9\n",
            "天数 标准差 0.7000000000000001\n"
          ]
        }
      ],
      "source": [
        "days10 = [break_day(r) for r in np.random.rand(10)]\n",
        "print(f\"天数 均值 {np.array(days10).mean()}\")\n",
        "print(f\"天数 标准差 {np.array(days10).std()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AmlS_wSaQXqC"
      },
      "source": [
        "## 30次仿真, 每次50个随机事件"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "xWo1tL_fQXqC",
        "outputId": "af92daac-2df3-49a1-9562-dad84e4b8a4c"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "均值 2200.9376007457918\n",
            "标准差 44.13581874135342\n"
          ]
        }
      ],
      "source": [
        "avg_costs = []\n",
        "for i in range(0, 300000):\n",
        "    days = [break_day(r) for r in np.random.rand(50)]\n",
        "    avg_cost = 11000.0 * 50 / sum(days)\n",
        "    # print(f\"平均成本{avg_cost}\")\n",
        "    avg_costs.append(avg_cost)\n",
        "\n",
        "print(f\"均值 {np.array(avg_costs).mean()}\")\n",
        "print(f\"标准差 {np.array(avg_costs).std()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### 分桶统计 画图"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 32,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 459
        },
        "id": "ErB1574YS6Rp",
        "outputId": "7f887834-a0e5-41de-8623-e7080c73de78"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "13\n",
            "12\n"
          ]
        },
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>cost</th>\n",
              "      <th>cost_bin</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>2235.772358</td>\n",
              "      <td>5</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2191.235060</td>\n",
              "      <td>4</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2191.235060</td>\n",
              "      <td>4</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>2148.437500</td>\n",
              "      <td>3</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>2182.539683</td>\n",
              "      <td>4</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>299995</th>\n",
              "      <td>2182.539683</td>\n",
              "      <td>4</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>299996</th>\n",
              "      <td>2235.772358</td>\n",
              "      <td>5</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>299997</th>\n",
              "      <td>2156.862745</td>\n",
              "      <td>3</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>299998</th>\n",
              "      <td>2107.279693</td>\n",
              "      <td>2</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>299999</th>\n",
              "      <td>2115.384615</td>\n",
              "      <td>2</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>300000 rows × 2 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "               cost cost_bin\n",
              "0       2235.772358        5\n",
              "1       2191.235060        4\n",
              "2       2191.235060        4\n",
              "3       2148.437500        3\n",
              "4       2182.539683        4\n",
              "...             ...      ...\n",
              "299995  2182.539683        4\n",
              "299996  2235.772358        5\n",
              "299997  2156.862745        3\n",
              "299998  2107.279693        2\n",
              "299999  2115.384615        2\n",
              "\n",
              "[300000 rows x 2 columns]"
            ]
          },
          "execution_count": 32,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "data = np.array(avg_costs)\n",
        "df = pd.DataFrame(data, columns=['cost'])\n",
        "couts_x = np.arange(2000, 2500, 40)\n",
        "print(len(couts_x))\n",
        "print(len( range(len(couts_x) - 1) ))\n",
        "df['cost_bin'] = pd.cut(df['cost'], bins=couts_x, labels=range(len(couts_x) - 1))\n",
        "df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 411
        },
        "id": "5h6tdHUhZN0t",
        "outputId": "3a2951bc-b6e7-4b6c-f980-a858cbb966f7"
      },
      "outputs": [
        {
          "ename": "NameError",
          "evalue": "name 'df' is not defined",
          "output_type": "error",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[0;32m/var/folders/lz/_5s3jxcd2g10p1nk3ppjb2kr0000gn/T/ipykernel_23676/3866555158.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      6\u001b[0m   \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtight_layout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mchart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhistogram\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'cost'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      9\u001b[0m \u001b[0mchart\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mNameError\u001b[0m: name 'df' is not defined"
          ]
        }
      ],
      "source": [
        "chart = histogram(df, *['cost'], **{})\n",
        "chart"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 33,
      "metadata": {},
      "outputs": [],
      "source": [
        "cost_bin_gp = df.groupby(by='cost_bin').size().reset_index(name=\"ct\").sort_values('cost_bin')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 34,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 448
        },
        "id": "i95HD43xXGpB",
        "outputId": "5abe8689-aaa9-4e3e-8ede-74743326cab8"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7fbafadc9e90>]"
            ]
          },
          "execution_count": 34,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAGdCAYAAAD+JxxnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLzklEQVR4nO3deVyTZ74+/isLCWvCJgEUEFfEfamI2m1kpC3Tc5zO6Wpba52208EZlTmttR1t50xbWp12Wltbx57zq52ZLuo533ZaXBlsdaqIiuICilqhIBpQloSdkNy/P0IicQUNebJc79crr4E8N8knTEkun/u5P7dMCCFARERE5IPkUhdAREREJBUGISIiIvJZDEJERETksxiEiIiIyGcxCBEREZHPYhAiIiIin8UgRERERD6LQYiIiIh8llLqAtyZxWLB2bNnERISAplMJnU5RERE1ANCCDQ2NiI2NhZy+bXP+TAIXcPZs2cRFxcndRlERER0AyorKzFgwIBrjmEQuoaQkBAA1l+kRqORuBoiIiLqCaPRiLi4OPvn+LUwCF2DbTpMo9EwCBEREXmYnlzWwouliYiIyGcxCBEREZHPYhAiIiIin8UgRERERD6LQYiIiIh8FoMQERER+SwGISIiIvJZDEJERETksxiEiIiIyGcxCBEREZHPYhAiIiIin8UgRERERD6LQYiIsH5/JfacrpW6DCIil2MQIvJxR6sMeP5/D+OJj/dCb2iTuhwiIpdiECLycfvK6wAAbSYL3tpWKnE1RESuxSBE5OMOVjTYv/7fA2dQfNYgXTFERC7GIETk4w5W1gMAEiICIQTw+qZjEEJIXBURkWswCBH5sPON7aisa4VMBnw4eyJUCjl2narFd6XnpS6NiMglGISIfFhRZQMAYGhUMJJjNXhi2kAA1rNCnWaLdIUREbkIgxCRDztYYZ0WGx8XBgDIvHMIQgP9cLKmCev3n5GyNCIil2AQIvJhtjNC4+NDAQDaAD8smDEUAPB2bima2jslqoyIyDUYhIh8lNkicMgehMLs989OSUBiZBAuNHXgLzt+kKg6IiLXYBAi8lEnaxrR3GFGsFqJIVHB9vtVSjkW35UEAPjoX6dxztAqVYlERH2OQYjIR9n6B40ZoIVCLnM4lj5Sh8kDw9FmsuBPW09IUB0RkWswCBH5KPuF0l3XB3Unk8nwYsYIAMD/O3gGR6vYZJGIvBODEJGPsp0Rsq0Yu9S4uFD829hYCAG8tpFNFonIOzEIEfkgQ6sJJ2uaAADjrnBGyOa59OFQKeXIP12L7cdrXFQdEZHrMAgR+aDDZxoAAPHhgYgMVl91XFx4IOayySIReTEGISIfVGSbFrvG2SCbzDuHICzQDz+cb8YX+yr7tjAiIhfrdRDauXMn7r33XsTGxkImk+Grr75yOC6EwLJlyxATE4OAgACkpaXh5MmTDmPq6uowe/ZsaDQahIaGYt68eWhqanIYc/jwYdx6663w9/dHXFwcli9fflktGzZsQFJSEvz9/TF69Ghs2rSp17UQ+aKDtv5BcaHXHavx98PCtGEAgD/nnkBjm6kPKyMicq1eB6Hm5maMHTsWq1atuuLx5cuXY+XKlVi9ejUKCgoQFBSE9PR0tLW12cfMnj0bxcXFyM3NRU5ODnbu3Imnn37aftxoNGLmzJlISEhAYWEhVqxYgVdeeQVr1qyxj9m9ezcefvhhzJs3DwcPHsSsWbMwa9YsHD16tFe1EPkaIUS3FWNXvlD6Uo+kxGNQZBBqmzuwmk0WicibiJsAQHz55Zf27y0Wi4iOjhYrVqyw39fQ0CDUarX4/PPPhRBClJSUCABi37599jGbN28WMplMVFVVCSGE+OCDD0RYWJhob2+3j1m8eLEYPny4/fsHHnhAZGRkONSTkpIinnnmmR7Xcj0Gg0EAEAaDoUfjiTxB2fkmkbA4Rwx9aZNoN5l7/HNbj54TCYtzxLCXNomq+pY+rJCI6Ob05vPbqdcIlZWVQa/XIy0tzX6fVqtFSkoK8vPzAQD5+fkIDQ3FpEmT7GPS0tIgl8tRUFBgH3PbbbdBpVLZx6Snp6O0tBT19fX2Md2fxzbG9jw9qYXIFx2stP4NjYrVQKXs+VvAT5N1mJwYjvZOC/60tbSvyiMicimnBiG9Xg8A0Ol0DvfrdDr7Mb1ej6ioKIfjSqUS4eHhDmOu9Bjdn+NqY7ofv14tl2pvb4fRaHS4EXkbe/+gHk6L2chkMvze3mSxCkfOsMkiEXk+rhrrJjs7G1qt1n6Li4uTuiQipzvYixVjlxozIBSzxsUCAF7bVMImi0Tk8ZwahKKjowEA1dXVDvdXV1fbj0VHR6OmxrExW2dnJ+rq6hzGXOkxuj/H1cZ0P369Wi61ZMkSGAwG+62ykkuFybu0mcw4ds56prO3Z4RsnrsrCSqlHHtO1+Gfx9hkkYg8m1ODUGJiIqKjo5GXl2e/z2g0oqCgAKmpqQCA1NRUNDQ0oLCw0D5m+/btsFgsSElJsY/ZuXMnTKaLy3Rzc3MxfPhwhIWF2cd0fx7bGNvz9KSWS6nVamg0GocbkTc5WmVAp0UgKkSNWK3/DT1G/9AAzJueCADI3nwMJjZZJCIP1usg1NTUhKKiIhQVFQGwXpRcVFSEiooKyGQyLFy4EK+++iq+/vprHDlyBI8//jhiY2Mxa9YsAMCIESNw11134amnnsLevXuxa9cuzJ8/Hw899BBiY62n3B955BGoVCrMmzcPxcXFWLduHd59911kZWXZ61iwYAG2bNmCt956C8ePH8crr7yC/fv3Y/78+QDQo1qIfE33aTGZTHbtwdfw6zsGIyJIhdPnm/HF3gonVUdEJIHeLkn79ttvBYDLbnPmzBFCWJetL126VOh0OqFWq8WMGTNEaWmpw2PU1taKhx9+WAQHBwuNRiPmzp0rGhsbHcYcOnRITJ8+XajVatG/f3/xxhtvXFbL+vXrxbBhw4RKpRIjR44UGzdudDjek1quhcvnyds8+/f9ImFxjvjwu1M3/Vh/3V0mEhbniPH/tU0YWjucUB0RkXP05vNbJgSvdrwao9EIrVYLg8HAaTLyCqnZeThnaMMXT0/BlEERN/VYJrMFd72zEz+cb8azdwzG4ruSnFQlEdHN6c3nN1eNEfmIc4ZWnDO0QS4DxgzQ3vTj+SnkWHK3dTn9/3xfhjP1LTf9mERErsYgROQjbButJkVrEKhSOuUxZ4yIwpRB4ehgk0Ui8lAMQkQ+wr7R6g30D7oaa5PFZADAV0VncajrOYiIPAWDEJGP6O1Gqz01qr8W943vDwB4bdMxNlkkIo/CIETkA0xmC45UWbfEcOYZIZv/TB8OtVKOvWV12FZSff0fICJyEwxCRD6gVN+INpMF2gA/JEYEOf3xY0MD8MtbrU0W39h8nE0WichjMAgR+QDbtNjYuFDI5TfeSPFanr1jCCKDVSi70IzPCthkkYg8A4MQkQ+wd5SOC+2z5whWK7EwbRgA4J1/noCh1XSdnyAikh6DEJEP6IsVY1fy0C1xGBIVjPoWEz747lSfPhcRkTMwCBF5ufrmDpRdaAYAjOvDM0IAoFTI8eI91g7TH39fjso6NlkkIvfGIETk5Yq6zgYN6heE0EBVnz/fncOjMHVwBDrMFqxgk0UicnMMQkRezt4/KM65/YOuRiaT4aWMEZDJgK8PnbUHMSIid8QgROTlXHV9UHcjY7W4b/wAAMBrG0vYZJGI3BaDEJEXs1iE/YyMK4MQAPxn+jD4+8mxr7weW4v1Ln1uIqKeYhAi8mKnLzShsa0TAX4KDNeFuPS5Y7QBeOrWQQCsTRY7OtlkkYjcD4MQkRc70NU/aPQALZQK1/+5P3P7YEQGq1Fe24JPC350+fMTEV0PgxCRF7M3UnTxtJhNsFqJrJ9amyy+m3cShhY2WSQi98IgROTFXL1i7EoemDQAw3TBaGgxYRWbLBKRm2EQIvJSTe2dOFHdCEC6M0KAtcnikntGAADW7mKTRSJyLwxCRF7q8JkGWATQPzQAOo2/pLXcMawfpg+JRIfZgje3HJe0FiKi7hiEiLyUbdn8OAnPBtnIZDK8eI+1yWLO4XM40DVlR0QkNQYhIi/lih3neyM5VoP/mGBrsniMTRaJyC0wCBF5ISGE5CvGruR3M4cjwE+Bwh/rsfkomywSkfQYhIi80Jn6VlxoaoefQoaRsVqpy7GL1vrjqdvYZJGI3AeDEJEXsu0vlhyjgb+fQtpiLvHMbYPQL0SNiroW/G0PmywSkbQYhIi8kL1/ULx0/YOuJkitxO+6miyuzDuJhpYOiSsiIl/GIETkhdzx+qDu7p8Uh+G6EBhaTXh/O5ssEpF0GISIvEx7pxklZ40ApO0ofS0KuQwvZlibLH6SX44fa5slroiIfBWDEJGXKTlrRIfZgoggFeLCA6Qu56puH9YPtw6NhMkssHxLqdTlEJGPYhAi8jLdp8VkMpm0xVzHSxkjIJcBG4+cQ+GPdVKXQ0Q+iEGIyMvYVoyNc5NGiteSFK3B/RPjAACvsskiEUmAQYjIy7jzirEr+d3MYQjwU+BgRQM2HWGTRSJyLQYhIi9S09iGM/WtkMmAMQPcp5HitURp/PHM7V1NFrccQ3unWeKKiMiXMAgReZGiruuDhkWFIMTfT9pieuHp2wYhKkSNyrpW/C2fTRaJyHUYhIi8iO36IHftH3Q1gSol/nPmcADWJov1zWyySESuwSBE5EUuXh8UKm0hN+AXEwcgKToExrZOvMcmi0TkIgxCRF7CbBE4fMYAwHMulO5OIZfhpa4mi3/bU47yC2yySER9j0GIyEucqG5ES4cZwWolBvcLlrqcG3Lr0H64fVg/mMwCb245LnU5ROQDGISIvIStkeLYOC0UcvdupHgtL95jbbK4+age+8rZZJGI+haDEJGXsF8f5Kb7i/XU8OgQPHgLmywSkWswCBF5CU9dMXYli346DIEqBQ5VNiDn8DmpyyEiL8YgROQFDK0mnKppAuAZW2tcT1SIP351+2AAwJtbjqPNxCaLRNQ3GISIvMChrrNBCRGBiAhWS1uMkzx16yDoNGqcqW/FX/PLpS6HiLwUgxCRFyiyTYt5wdkgmwCVwt5k8b3tp1DHJotE1AcYhIi8gKdttNpT900YgBExGjS2dWJl3kmpyyEiL8QgROThhBD2C6W94fqg7hRyGX7f1WTx73t+xOnzTRJXRETehkGIyMOV17agocUElVKOETEaqctxumlDInHn8H7otAis2FoqdTlE5GUYhIg8nG1abHR/LVRK7/yTfuFu61mhbSXVaGjhtUJE5Dze+a5J5ENsHaW96ULpSw2PDkFSdAjMFoG8YzVSl0NEXoRBiMjDHaz0zgulLzVzZDQAYFuJXuJKiMibMAgRebDWDjOOnWsE4B0dpa8lfaQOALDjxHm0drDBIhE5B4MQkQc7etYAs0VAp1EjRusvdTl9KjlGg/6hAWgzWfCvk+elLoeIvASDEJEH677RqkzmuTvO94RMJkN61/TY1uJqiashIm/h9CBkNpuxdOlSJCYmIiAgAIMHD8Yf//hHhx2khRBYtmwZYmJiEBAQgLS0NJw86dgsra6uDrNnz4ZGo0FoaCjmzZuHpibHHiKHDx/GrbfeCn9/f8TFxWH58uWX1bNhwwYkJSXB398fo0ePxqZNm5z9kokkY7tQepyXT4vZzOyaHss7Xo1Os0XiaojIGzg9CL355pv48MMP8f777+PYsWN48803sXz5crz33nv2McuXL8fKlSuxevVqFBQUICgoCOnp6Whra7OPmT17NoqLi5Gbm4ucnBzs3LkTTz/9tP240WjEzJkzkZCQgMLCQqxYsQKvvPIK1qxZYx+ze/duPPzww5g3bx4OHjyIWbNmYdasWTh69KizXzaRJHxhxVh3kxLCEB6kQkOLCXvL66Quh4i8gXCyjIwM8eSTTzrcd99994nZs2cLIYSwWCwiOjparFixwn68oaFBqNVq8fnnnwshhCgpKREAxL59++xjNm/eLGQymaiqqhJCCPHBBx+IsLAw0d7ebh+zePFiMXz4cPv3DzzwgMjIyHCoJSUlRTzzzDM9ei0Gg0EAEAaDoUfjiVzpbEOLSFicIwYt2Sia201Sl+My/7m+SCQszhEv/+Oo1KUQkZvqzee3088ITZ06FXl5eThx4gQA4NChQ/j+++9x9913AwDKysqg1+uRlpZm/xmtVouUlBTk5+cDAPLz8xEaGopJkybZx6SlpUEul6OgoMA+5rbbboNKpbKPSU9PR2lpKerr6+1juj+PbYzteS7V3t4Oo9HocCNyV7azQUnRIQhUKaUtxoVs1wltK9Y7TLkTEd0Ip797vvDCCzAajUhKSoJCoYDZbMZrr72G2bNnAwD0emsPEJ1O5/BzOp3Ofkyv1yMqKsqxUKUS4eHhDmMSExMvewzbsbCwMOj1+ms+z6Wys7Pxhz/84UZeNpHLXdxoNVTaQlxs+tBIBKoUOGtow9EqI0YP0EpdEhF5MKefEVq/fj0+/fRTfPbZZzhw4AA++eQT/OlPf8Inn3zi7KdyuiVLlsBgMNhvlZWVUpdEdFUXrw/y7kaKl/L3U+D2Yf0AsLkiEd08pweh5557Di+88AIeeughjB49Go899hgWLVqE7OxsAEB0tPW0dnW14/LX6upq+7Ho6GjU1Di20e/s7ERdXZ3DmCs9RvfnuNoY2/FLqdVqaDQahxuROzKZLThSZQDge2eEAHRbRs8gREQ3x+lBqKWlBXK548MqFApYLNalromJiYiOjkZeXp79uNFoREFBAVJTUwEAqampaGhoQGFhoX3M9u3bYbFYkJKSYh+zc+dOmEwm+5jc3FwMHz4cYWFh9jHdn8c2xvY8RJ7q+LlGtHdaoA3wQ2JkkNTluNydw6OglMtworoJZReapS6HiDyY04PQvffei9deew0bN25EeXk5vvzyS7z99tv4+c9/DsDaFG3hwoV49dVX8fXXX+PIkSN4/PHHERsbi1mzZgEARowYgbvuugtPPfUU9u7di127dmH+/Pl46KGHEBsbCwB45JFHoFKpMG/ePBQXF2PdunV49913kZWVZa9lwYIF2LJlC9566y0cP34cr7zyCvbv34/58+c7+2UTuZRtf7FxcaFe30jxSrSBfkgdHAHAetE0EdENc/aSNaPRKBYsWCDi4+OFv7+/GDRokHjppZcclrlbLBaxdOlSodPphFqtFjNmzBClpaUOj1NbWysefvhhERwcLDQajZg7d65obGx0GHPo0CExffp0oVarRf/+/cUbb7xxWT3r168Xw4YNEyqVSowcOVJs3Lixx6+Fy+fJXS384qBIWJwj/pxbev3BXuqvu8tEwuIc8fNV30tdChG5md58fsuE4PrTqzEajdBqtTAYDLxeiNzKHSu+RXltCz55crL9wmFfoze0YUp2HmQyoGDJDERpvHuvNSLqud58fnOvMSIPU9fcgfLaFgDAuAGh0hYjoWitP8bFhUIIIPcY9x4johvDIETkYYq6rg8a3C8I2kA/iauRlm3vsW3chJWIbhCDEJGHsfcPivet/kFXYltGv/uHCzC2ma4zmojocgxCRB6mqLIBgG/2D7rU4H7BGNwvCCazwLfHa67/A0REl2AQIvIgFotAkY92lL4a+95jJZweI6LeYxAi8iA/nG9CY3snAvwUGKYLlroctzCzKwh9d7wGbSazxNUQkadhECLyILbrg8YM0EKp4J8vAIzpr0W0xh/NHWbk/1ArdTlE5GH4TkrkQWwdpXmh9EVyucy+eox7jxFRbzEIEXmQiyvGQiWtw93MTLZOj+WWVMNsYY9YIuo5BiEiD9HU3onS6kYAwPi4UGmLcTMpg8Kh8VeitrkDByrqpS6HiDwIgxCRhzhc2QAhgP6hAdxO4hJ+CjlmjOiaHjvK6TEi6jkGISIPcZD9g64p3dZluqQa3EKRiHqKQYjIQ9iuDxrHabErum1YP6iVclTUteC4vlHqcojIQzAIEXkAIYR9jzGuGLuyQJUStw7tB4B7jxFRzzEIEXmAM/WtuNDUAT+FDCNjNVKX47bSuYyeiHqJQYjIA9hWQiXHauHvp5C4Gvc1Y4QOchlQcs6IyroWqcshIg/AIETkAez9g3h90DWFB6kwOTEcAPceI6KeYRAi8gBcMdZztuaKnB4jop5gECJyc20mM0rOGgAAE3ih9HXZttvYX16H2qZ2iashInfHIETk5krOGWEyC0QGqzAgLEDqctzegLBAjOqvgUUAecdqpC6HiNwcgxCRm+veP0gmk0lbjIewTY9tK+H0GBFdG4MQkZs7WMH+Qb2VPtIahHaevIDm9k6JqyEid8YgROTmuGKs94bpgpEQEYiOTgt2nDgvdTlE5MYYhIjcWI2xDVUNrZDJgDEMQj0mk8nsZ4W2cfUYEV0DgxCRG7Mtmx+uC0GwWiltMR5mZrJ19Vje8Rp0dFokroaI3BWDEJEbs0+LsX9Qr02ID0NksBqNbZ0oKKuVuhwiclMMQkRuzH6hdBwvlO4tuVyGnyZz7zEiujYGISI31Wm24EiVtZEizwjdGFtzxW3F1bBYhMTVEJE7YhAiclMnqpvQ0mFGiFqJwf2CpS7HI00dHIFgtRI1je04dKZB6nKIyA0xCBG5qYOV1mmxsXGhkMvZSPFGqJUK3DG8HwBgazE3YSWiyzEIEbkpXijtHPZl9OwyTURXwCBE5KYudpQOlbYQD3fH8H5QKeQ4fb4Zp2oapS6HiNwMgxCRGzK0mPDD+WYAwDiuGLspIf5+mDokAgCnx4jocgxCRG6oqOvC3oERgQgPUklbjBdgl2kiuhoGISI3xI1WnStthA4yGXDojAHnDK1Sl0NEboRBiMgNFXVtrcHrg5yjX4gaE7tCZW4Jp8eI6CIGISI3I4Swrxgbx41WncbWXJFdpomoOwYhIjdTdqEZhlYT1Eo5kqI1UpfjNWYmW68T2nO6DoYWk8TVEJG7YBAicjO2s0Gj+2uhUvJP1FkGRgZhuC4EZotA3nFOjxGRFd9lidyMraM0rw9yvnROjxHRJRiEiNzMxY7SXDHmbDO7ltHvOHEerR1miashInfAIETkRlo6OnFcb+1+zDNCzjcyVoP+oQFoM1nwr5PnpS6HiNwAgxCRGzlyxgCzRSBa448YbYDU5XgdmUxmXz22jcvoiQgMQkRuxdY/iMvm+45t9VjesWp0mi0SV0NEUmMQInIj3HG+790yMAxhgX6obzFhX3m91OUQkcQYhIjchBACB7i1Rp9TKuSYMYKrx4jIikGIyE2cM7ShprEdCrkMo/trpS7Hq9k2Yc0tqYYQQuJqiEhKDEJEbsI2LTYiJgQBKoW0xXi5W4dGIsBPgaqGVhSfNUpdDhFJiEGIyE3Yd5yP47RYX/P3U+D2Yf0AcHqMyNcxCBG5iYPccd6l0kd1LaMv5jJ6Il/GIETkBjo6LThSZQDAC6Vd5SfDdVDKZSitbkT5hWapyyEiiTAIEbmB43ojOjotCA30w8CIQKnL8QnaQD9MGRQBANhWwukxIl/VJ0GoqqoKjz76KCIiIhAQEIDRo0dj//799uNCCCxbtgwxMTEICAhAWloaTp486fAYdXV1mD17NjQaDUJDQzFv3jw0NTU5jDl8+DBuvfVW+Pv7Iy4uDsuXL7+slg0bNiApKQn+/v4YPXo0Nm3a1Bcvmeim2C6UHhcXCplMJm0xPmSmfRNWTo8R+SqnB6H6+npMmzYNfn5+2Lx5M0pKSvDWW28hLOzi6f7ly5dj5cqVWL16NQoKChAUFIT09HS0tbXZx8yePRvFxcXIzc1FTk4Odu7ciaefftp+3Gg0YubMmUhISEBhYSFWrFiBV155BWvWrLGP2b17Nx5++GHMmzcPBw8exKxZszBr1iwcPXrU2S+b6KbwQmlp2LpMH6ioR01j23VGE5FXEk62ePFiMX369Kset1gsIjo6WqxYscJ+X0NDg1Cr1eLzzz8XQghRUlIiAIh9+/bZx2zevFnIZDJRVVUlhBDigw8+EGFhYaK9vd3huYcPH27//oEHHhAZGRkOz5+SkiKeeeaZHr0Wg8EgAAiDwdCj8UQ36rbl20XC4hyxo7RG6lJ8zr+9/71IWJwjPt3zo9SlEJGT9Obz2+lnhL7++mtMmjQJ999/P6KiojB+/Hh89NFH9uNlZWXQ6/VIS0uz36fVapGSkoL8/HwAQH5+PkJDQzFp0iT7mLS0NMjlchQUFNjH3HbbbVCpVPYx6enpKC0tRX19vX1M9+exjbE9z6Xa29thNBodbkR9rbapHT/WtgAAxnKPMZebmcwu00S+zOlB6PTp0/jwww8xdOhQbN26Fc8++yx++9vf4pNPPgEA6PXWNxudTufwczqdzn5Mr9cjKirK4bhSqUR4eLjDmCs9RvfnuNoY2/FLZWdnQ6vV2m9xcXG9fv1EvWXbaHVIVDC0AX7SFuODbF2md/9wAY1tJomrISJXc3oQslgsmDBhAl5//XWMHz8eTz/9NJ566imsXr3a2U/ldEuWLIHBYLDfKisrpS6JfIB9o1WeDZLEkKhgDOoXBJNZ4NvS81KXQ0Qu5vQgFBMTg+TkZIf7RowYgYqKCgBAdLT1X1/V1Y6rNKqrq+3HoqOjUVNT43C8s7MTdXV1DmOu9Bjdn+NqY2zHL6VWq6HRaBxuRH3tYCU3WpWa7awQp8eIfI/Tg9C0adNQWlrqcN+JEyeQkJAAAEhMTER0dDTy8vLsx41GIwoKCpCamgoASE1NRUNDAwoLC+1jtm/fDovFgpSUFPuYnTt3wmS6eCo7NzcXw4cPt69QS01NdXge2xjb8xBJzWwROFRpbaQ4jmeEJGO7Tui74zVo7zRLXA0RuZLTg9CiRYuwZ88evP766zh16hQ+++wzrFmzBpmZmQAAmUyGhQsX4tVXX8XXX3+NI0eO4PHHH0dsbCxmzZoFwHoG6a677sJTTz2FvXv3YteuXZg/fz4eeughxMbGAgAeeeQRqFQqzJs3D8XFxVi3bh3effddZGVl2WtZsGABtmzZgrfeegvHjx/HK6+8gv3792P+/PnOftlEN+SH801oau9EoEqBYbpgqcvxWWMHhEKnUaO5w4zdp2qlLoeIXKkvlq198803YtSoUUKtVoukpCSxZs0ah+MWi0UsXbpU6HQ6oVarxYwZM0RpaanDmNraWvHwww+L4OBgodFoxNy5c0VjY6PDmEOHDonp06cLtVot+vfvL954443Lalm/fr0YNmyYUKlUYuTIkWLjxo09fh1cPk997Yu9P4qExTniwb/slroUn/f7L4+IhMU54oX/OyR1KUR0k3rz+S0TQgipw5i7MhqN0Gq1MBgMvF6I+sQL/3cYX+yrxLN3DMbiu5KkLsen/evkeTz2P3sRGaxCwYtpUMjZ4ZvIU/Xm85t7jRFJiCvG3MeUQREI8VfiQlOHvdM3EXk/BiEiiTS2mXCiphEAMC4+VNpiCH4KOWYkWfuXcfUYke9gECKSyOEzBggBDAgLQFSIv9TlELovo68Grxog8g0MQkQSsW+0yv5BbuP24f2gVspRUdeC0upGqcshIhdgECKSiG1rDfYPch+BKiVuHRoJANh6tPo6o4nIGzAIEUlACHHxQmleH+RWZnZNj20r4XVCRL6AQYhIApV1raht7oBKIcfIWLZmcCczkqIglwHFZ42orGuRuhwi6mMMQkQSsO0vlhyrgVqpkLga6i4iWI1bBoYDALaVcHqMyNsxCBFJgNNi7s0+PcZl9ERej0GISAJcMebebJuw7iuvQ21Tu8TVEFFfYhAicrE2kxnFZ40A2FHaXcWFB2JkrAYWAeQdr5G6HCLqQwxCRC5WfNaATotAZLAaA8ICpC6HrmJmMqfHiHwBgxCRi9muDxoXFwqZjBt7uqv0UdbpsZ0nL6C5vVPiaoiorzAIEbnYwa5GirxQ2r0N14UgPjwQHZ0W7DxxXupyiKiPMAgRuVgRV4x5BJlMhvSR1rNC3ISVyHsxCBG5ULWxDVUNrZDLgDEDQqUuh67Dtow+73gNTGaLxNUQUV9gECJyIdv1QcN0IQhWK6Uthq5rQnwYIoNVaGzrxJ7TtVKXQ0R9gEGIyIVsHaXZP8gzKOQy/LSrp9C2YnaZJvJGDEJELsSO0p7Hvoy+RA+LRUhcDRE5G4MQkYt0mi04csYAgI0UPcnUIREIUilQbWzH4SqD1OUQkZMxCBG5SGl1I1pNZoSolRjcL1jqcqiH1EoF7kiKAsDVY0TeiEGIyEXsjRTjQyGXs5GiJ0nvWj3GIETkfRiEiFzEfn0Qp8U8zh3D+8FPIcPp8804VdMkdTlE5EQMQkQuwhVjnkvj74epgyMB8KwQkbdhECJygYaWDpw+3wzAuscYeR7b9Ni2Ei6jJ/ImDEJELlDUtb9YYmQQwoJU0hZDNyQtOQoyGXCosgF6Q5vU5RCRkzAIEbkArw/yfFEh/pjQNa25rYTTY0TegkGIyAVsO86PYyNFjzaTXaaJvA6DEFEfs1gEDnUFofFxvFDak9k2Yd1zuhaGFpPE1RCRMzAIEfWxstpmGFpNUCvlSIoJkbocugmJkUEYpgtGp0VgeynPChF5AwYhoj5muz5ozAAt/BT8k/N09uaKRxmEiLwB35WJ+tjBCvYP8ia2ILTjxHm0mcwSV0NEN4tBiKiPccWYdxkZq0H/0AC0msz418kLUpdDRDeJQYioD7V0dOK43giAZ4S8hUwmw0+7Vo+xyzSR52MQIupDu0/VwiKA/qEBiNb6S10OOcnMkdYglHesGp1mi8TVENHNYBAi6kObjpwDcPGDk7zD5IHhCA30Q32LCfvK66Uuh4huAoMQUR9p7zQjt2tfqozRMRJXQ86kVMgxI6mruSK7TBN5NAYhoj7yrxMX0NjeiWjNxa0ZyHukj7zYZVoIIXE1RHSjGISI+ohtWuyuUdGQy2USV0POdtuwfgjwU6CqoRXFZ41Sl0NEN4hBiKgPOEyLjeG0mDfy91PgtmGRAIBtXD1G5LEYhIj6wPcnrdNiOo0aEzkt5rXsXaa5CSuRx2IQIuoDG7umxe4eFcNpMS/2k6QoKOQylFY3ovxCs9TlENENYBAicjJOi/mO0EAVpgwKB8DVY0SeikGIyMl2nbqAxjZOi/mKmcnW6bFtnB4j8kgMQkROlnOY02K+xNYss7CiHucb2yWuhoh6i0GIyIm6T4vdwyaKPiFGG4CxA7QQAvb/74nIczAIETmRbVosKkSNSQmcFvMVM7tWj/E6ISLPwyBE5EQbD1s/CO8ZzWkxX2LrMr37VC0a20wSV0NEvcEgROQkHZ0W5JZcDELkOwb3C8agyCB0mC34rvS81OUQUS8wCBE5ya5TF2DktJhPkslk9umxrewyTeRRGISInORiE0XuLeaL7hplDUL/PFaNhpYOiashop5iECJygo5Oi32/KU6L+aaxA7QYEaNBm8mCdfsqpS6HiHqoz4PQG2+8AZlMhoULF9rva2trQ2ZmJiIiIhAcHIxf/OIXqK52XHZaUVGBjIwMBAYGIioqCs899xw6Ozsdxnz33XeYMGEC1Go1hgwZgrVr1172/KtWrcLAgQPh7++PlJQU7N27ty9eJvk427RYvxA1Jg0Ml7ockoBMJsPcqQMBAH/N/xGdZou0BRFRj/RpENq3bx/+8pe/YMyYMQ73L1q0CN988w02bNiAHTt24OzZs7jvvvvsx81mMzIyMtDR0YHdu3fjk08+wdq1a7Fs2TL7mLKyMmRkZODOO+9EUVERFi5ciF/+8pfYunWrfcy6deuQlZWFl19+GQcOHMDYsWORnp6OmpqavnzZ5IO6T4spOC3ms/5tXCzCg1SoamjFP4/xfYbII4g+0tjYKIYOHSpyc3PF7bffLhYsWCCEEKKhoUH4+fmJDRs22MceO3ZMABD5+flCCCE2bdok5HK50Ov19jEffvih0Gg0or29XQghxPPPPy9Gjhzp8JwPPvigSE9Pt38/efJkkZmZaf/ebDaL2NhYkZ2d3aPXYDAYBABhMBh69+LJp7SbzGL0y1tEwuIcseeHC1KXQxJbvuWYSFicIx78y26pSyHyWb35/O6zM0KZmZnIyMhAWlqaw/2FhYUwmUwO9yclJSE+Ph75+fkAgPz8fIwePRo6nc4+Jj09HUajEcXFxfYxlz52enq6/TE6OjpQWFjoMEYulyMtLc0+5lLt7e0wGo0ON6Lr2fUDp8XookenJEAhl2HP6TocO8f3ECJ31ydB6IsvvsCBAweQnZ192TG9Xg+VSoXQ0FCH+3U6HfR6vX1M9xBkO247dq0xRqMRra2tuHDhAsxm8xXH2B7jUtnZ2dBqtfZbXFxcz180+axNhzktRhfFaAPsK8jW7iqXthgiui6nB6HKykosWLAAn376Kfz9/Z398H1qyZIlMBgM9ltlJVd+0LWZzBZs495idAnbRdNfFVWhrplL6YncmdODUGFhIWpqajBhwgQolUoolUrs2LEDK1euhFKphE6nQ0dHBxoaGhx+rrq6GtHR1n9FRUdHX7aKzPb99cZoNBoEBAQgMjISCoXiimNsj3EptVoNjUbjcCO6ll2nLsDQakJksBq3cFqMukxMCMPo/lq0d1rwxb4KqcshomtwehCaMWMGjhw5gqKiIvtt0qRJmD17tv1rPz8/5OXl2X+mtLQUFRUVSE1NBQCkpqbiyJEjDqu7cnNzodFokJycbB/T/TFsY2yPoVKpMHHiRIcxFosFeXl59jFEN2sjp8XoCmQyGZ7oOiv0Ny6lJ3JrSmc/YEhICEaNGuVwX1BQECIiIuz3z5s3D1lZWQgPD4dGo8FvfvMbpKamYsqUKQCAmTNnIjk5GY899hiWL18OvV6P3//+98jMzIRarQYA/OpXv8L777+P559/Hk8++SS2b9+O9evXY+PGjfbnzcrKwpw5czBp0iRMnjwZ77zzDpqbmzF37lxnv2zyQZwWo2v52dgYZG8+hnOGNmwrqeZ/I0RuyulBqCf+/Oc/Qy6X4xe/+AXa29uRnp6ODz74wH5coVAgJycHzz77LFJTUxEUFIQ5c+bgv/7rv+xjEhMTsXHjRixatAjvvvsuBgwYgP/+7/9Genq6fcyDDz6I8+fPY9myZdDr9Rg3bhy2bNly2QXURDei+7TY5EROi5EjtVKBRybHY+X2U/h4VxmDEJGbkgkhhNRFuCuj0QitVguDwcDrhegyz//vIazffwaPTUnAH2eNuv4PkM+pNrZh2hvb0WkRyPnNdIzqr5W6JCKf0JvPb+41RnQDOC1GPaHT+Nv/+1i7u1zaYojoihiEiG7A7h9q0dDCaTG6vrnTBgIAvi46iwtN7dIWQ0SXYRAiugG2Jop3jdJxtRhd0/j4MIyNC0WH2YIv9nIpPZG7YRAi6iWT2YKtJdbu5JwWo56wNVj8254fYeJSeiK3wiBE1EsXp8VUSEmMkLoc8gD3jI5BvxA1qo3t2Hz0ylv8EJE0GISIesk2LZY+kk0UqWdUSjlmp8QDANbuKpO4GiLqjkGIqBe6T4tljOG0GPXc7JQE+ClkOFDRgEOVDVKXQ0RdGISIeiGf02J0g/qFqHHvmFgAwCdcSk/kNhiEiHph0xFOi9GNm9N10fQ3h8+iprFN2mKICACDEFGPmcwWbC3umhbjajG6AWPjQjEhPhQms8BnBVxKT+QOGISIeij/h1rUt5gQEaRiE0W6YU9MSwQA/H1PBTo6uZSeSGoMQkQ9ZJ8WGxUNpYJ/OnRj7h4VDZ1GjQtN7fb/pohIOnw3J+oBTouRs/gp5HhsSgIA4GNeNE0kOQYhoh7Yc/ritFgKp8XoJj08OR4qpRyHKhtwsKJe6nKIfBqDEFEPcFqMnCkiWI1/G2tdSs9d6YmkxXd0ouvoNFuwtbgaAKfFyHme6FpKv/HwOVQbuZSeSCoMQkTXsed0HeqaOxDOaTFyolH9tbhlYBg6LQKf7vlR6nKIfBaDENF1bDxyFoC1iSKnxciZ5nYtpf+0oALtnWaJqyHyTXxXJ7oGTotRX5qZrEOM1h+1zR3IOcSl9ERSYBAiuobu02JTBnFajJxLqZDjsVTrUvq1u8shhJC4IiLfwyBEdA0bu+0txmkx6gsP3RIPtVKOI1UGFP7IpfRErsZ3dqKr6GQTRXKB8CAVZo3rD4ANFomkwCBEdBUFZZwWI9d4YtpAAMCWo3qcM7RKWwyRj2EQIrqKi9NiOk6LUZ8aEaPBlEHhMFsE/s6l9EQuxXd3oivoNFuw9ah1WuweTouRCzwx1bqU/rOCCrSZuJSeyFUYhIiuoKCsDrXNHQgL9EPqoAipyyEfkDYiCv1DA1DfYsLXRWelLofIZzAIEV0BV4uRqykVcjyeenFXei6lJ3INvsMTXaL7tFjGGE6Lkes8eEsc/P3kOHbOiL1ldVKXQ+QTGISILrGX02IkkdBAFe6bMAAAd6UnchUGIaJLcFqMpGTblX5rsR5VDVxKT9TX+C5P1I3ZIuxNFLlajKQwTBeCaUMiYBHA3/K5lJ6orzEIEXVTUFaLC00dCA30Q+pgTouRNGxL6T/fW4HWDi6lJ+pLDEJE3Ww83DUtlhwNP06LkUR+khSFuPAAGFpN+KqoSupyiLwa3+mJujhMi3G1GElIIZdhTupAAMDaXVxKT9SXGISIunSfFpvKaTGS2P2T4hCoUqC0uhH5p2ulLofIazEIEXXZdITTYuQ+tAF++IVtKf2ucmmLIfJifLcngnVabMvRagCcFiP3MWeqtdN07rFqVNa1SFwNkXdiECKCtYnihaZ2TouRWxkSFYJbh0ZCCOCv+eVSl0PklRiEiHBxWmxmso7TYuRW5k4bCAD4Yl8lmts7pS2GyAvxHZ98ntkisPkomyiSe7pjWBQGRgSisa0TXx7kUnoiZ2MQIp9nmxbTBvhh2pBIqcshciCXyzCna9uNtdyVnsjpGITI53FajNzdf0wcgCCVAqdqmrDrFJfSEzkT3/XJp3WfFsvgajFyUyH+frh/UhwA4ONdZRJXQ+RdGITIp+0r57QYeYbHU61L6beX1qD8QrPE1RB5DwYh8mmcFiNPMahfMO4c3q9rKT13pSdyFr7zk89yWC3GaTHyAE9Ms+5Kv2F/JZq4lJ7IKRiEyGftK6/D+cZ2aPyVmDaY02Lk/m4dEolB/YLQ2N6J/3fgjNTlEHkFBiHyWfZpsZHRUCn5p0DuTy6X4QnbUvpd5bBYuJSe6Gbx3Z98ksNqMTZRJA9y34QBCFErcfpCM3aePC91OUQej0GIfNL+7tNiXC1GHiRYrbQvpV+7u1zaYoi8AIMQ+SROi5EnmzM1ATIZ8F3peZw+3yR1OUQejZ8A5HMsnBYjD5cQEYQZSVEAuJSe6GY5PQhlZ2fjlltuQUhICKKiojBr1iyUlpY6jGlra0NmZiYiIiIQHByMX/ziF6iurnYYU1FRgYyMDAQGBiIqKgrPPfccOjsdl4t+9913mDBhAtRqNYYMGYK1a9deVs+qVaswcOBA+Pv7IyUlBXv37nX2SyYPs//HetRwWow83BNTLy6lb2wzSVwNkedyehDasWMHMjMzsWfPHuTm5sJkMmHmzJlobr7YCXXRokX45ptvsGHDBuzYsQNnz57FfffdZz9uNpuRkZGBjo4O7N69G5988gnWrl2LZcuW2ceUlZUhIyMDd955J4qKirBw4UL88pe/xNatW+1j1q1bh6ysLLz88ss4cOAAxo4di/T0dNTU1Dj7ZZMHsU2L/TSZ02LkuaYNicCQqGA0d5ixYT+X0hPdMNHHampqBACxY8cOIYQQDQ0Nws/PT2zYsME+5tixYwKAyM/PF0IIsWnTJiGXy4Ver7eP+fDDD4VGoxHt7e1CCCGef/55MXLkSIfnevDBB0V6err9+8mTJ4vMzEz792azWcTGxors7Owe1W4wGAQAYTAYevmqyV2ZzRZxy6u5ImFxjsg7pr/+DxC5sb/ll4uExTnituXbhdlskbocIrfRm8/vPv/nsMFgAACEh4cDAAoLC2EymZCWlmYfk5SUhPj4eOTn5wMA8vPzMXr0aOh0OvuY9PR0GI1GFBcX28d0fwzbGNtjdHR0oLCw0GGMXC5HWlqafcyl2tvbYTQaHW7kXWzTYiH+Skwf0k/qcohuyn0T+kPjr8SPtS347gTPdBPdiD4NQhaLBQsXLsS0adMwatQoAIBer4dKpUJoaKjDWJ1OB71ebx/TPQTZjtuOXWuM0WhEa2srLly4ALPZfMUxtse4VHZ2NrRarf0WFxd3Yy+c3NbFvcU4LUaeL1ClxEOT4wEAH+8ql7YYIg/Vp58EmZmZOHr0KL744ou+fBqnWbJkCQwGg/1WWVkpdUnkRNbVYtYglDEmWuJqiJzjsSkJkMuAf528gFM1jVKXQ+Rx+iwIzZ8/Hzk5Ofj2228xYMAA+/3R0dHo6OhAQ0ODw/jq6mpER0fbx1y6isz2/fXGaDQaBAQEIDIyEgqF4opjbI9xKbVaDY1G43Aj71FYUY9qI6fFyLvEhQcibYT1zDcbLBL1ntODkBAC8+fPx5dffont27cjMTHR4fjEiRPh5+eHvLw8+32lpaWoqKhAamoqACA1NRVHjhxxWN2Vm5sLjUaD5ORk+5juj2EbY3sMlUqFiRMnOoyxWCzIy8uzjyHfsvGwbbWYjtNi5FWemDYQAPB/hVUwtHIpPVFvOP3TIDMzE3//+9/x2WefISQkBHq9Hnq9Hq2trQAArVaLefPmISsrC99++y0KCwsxd+5cpKamYsqUKQCAmTNnIjk5GY899hgOHTqErVu34ve//z0yMzOhVqsBAL/61a9w+vRpPP/88zh+/Dg++OADrF+/HosWLbLXkpWVhY8++giffPIJjh07hmeffRbNzc2YO3eus182uTmHaTE2USQvkzooAsN1IWg1mbFhP6f0iXrF2UvWAFzx9vHHH9vHtLa2il//+tciLCxMBAYGip///Ofi3LlzDo9TXl4u7r77bhEQECAiIyPF7373O2EymRzGfPvtt2LcuHFCpVKJQYMGOTyHzXvvvSfi4+OFSqUSkydPFnv27Onxa+Hyee+xt6xWJCzOEaOWbRFtpk6pyyFyus8LfhQJi3PE9DfzRCeX0pOP683nt0wIIaSLYe7NaDRCq9XCYDDweiEP98rXxVi7uxz3je+Ptx8cJ3U5RE7X2mFG6ht5aGgx4aPHJ+Gnybrr/xCRl+rN5zcvlCCv57hajNNi5J0CVAo8dIt1Kf3a3WUSV0PkORiEyOsdsK0WUysxfSj3FiPv9ViqdSn9rlO1KNVzKT1RTzAIkdfbeOTiajG1UiFxNUR9p39oANJHWtuDcCk9Uc8wCJFXs1gENh+xdhK/h6vFyAfMnWZtWfLlwTNoaOmQuBoi98cgRF7tYGU99MY2hKiVuHUYp8XI+90yMAzJMRq0mSxYt49L6Ymuh0GIvFpOVxPFNE6LkY+QyWT2Bot/zf8RnWaLtAURuTkGIfJanBYjX/VvY2MRHqRCVUMr/nms+vo/QOTDGITIa9mmxYLVStzK1WLkQ/z9FHh4chwA7kpPdD0MQuS1Nh62ng36abIO/n6cFiPf8uiUBCjkMhSU1aHkrFHqcojcFoMQeaXuTRQ5LUa+KEYbgLtHWZfSf8Kl9ERXxSBEXulgZQPOGTgtRr5tbtdF018VVaGumUvpia6EQYi80qauJoppI6I4LUY+a0J8GEb316K904LP91ZIXQ6RW2IQIq9jsQh7EOK0GPkymUyGJ6YOBAD8fc+PMHEpPdFlGITI63SfFrttWD+pyyGS1M/GxiAyWIVzhjZsK+ZSeqJLMQiR17GdDZrBaTEiqJUKPJKSAIC70hNdCYMQeRVrE0VrEMrgtBgRAODRlHgo5TLsK6/H0SqD1OUQuRUGIfIqRWcacJbTYkQOojT+yBhj/YcBd6UncsQgRF5l02FOixFdie2i6a+LzuJCU7u0xRC5EQYh8hpCCGw+yr3FiK5kfHwYxsaFosNswWcFXEpPZMMgRF6jqLIBVQ2tCFIpcDunxYguM7frrNB720/ib/nlEEJIWxCRG2AQIq+x0T4txr3FiK7kZ2NicM/oaJjMAkv/UYxF64rQ0tEpdVlEkmIQIq/AaTGi61Mq5Fj1yAS8dM8IKOQyfFV0Fv/+/i6cqmmSujQiyTAIkVfoPi12x3BOixFdjUwmw1O3DcLnT01BVIgaJ2ua8O/vf4+cw2elLo1IEgxC5BUuNlHktBhRT0xODEfOb6djyqBwNHeYMf+zg3jl62J0dHIbDvItDELk8YQQ2HSE02JEvRUV4o+/z0vBs3cMBmDtMfTgmnycM7RKXBmR6zAIkcc7dMbAaTGiG6RUyLH4riR89PgkhPgrcbCiARkrv8e/Tp6XujQil2AQIo9nmxb7CafFiG7YT5N12PibWzEyVoO65g48/v/txcq8k7BYuMSevBuDEHk0IYR92XzG6GiJqyHybPERgfi/Z6fi4clxEAJ4O/cE5q7dh/rmDqlLI+ozDELk0WzTYoEqBe4YHiV1OUQez99Pgez7xuBP94+FWinHjhPn8bP3vkdRZYPUpRH1CQYh8mhcLUbUN/5j4gB8lTkNAyMCUdXQivtX72Y3avJKDELksTo6LfYgxGkxIucbEaPB17+ZjvSROnajJq/FIEQeRwiB3JJqpL+zE2fqbavFOC1G1Bc0/n5Y/ehEdqMmr8UgRB7l2DkjZv93AZ76636UXWhGZLAKf35wHKfFiPoQu1GTN5MJTvheldFohFarhcFggEajkbocn3a+sR1v55Zi3b5KWASgUsjx5PREZN45GCH+flKXR+Qzahrb8NvPD2LP6ToAwBNTB+LFe0ZApeS/q8l99Obzm0HoGhiEpNdmMuPjXeVY9e0pNLVbr0vIGB2DF+5OQlx4oMTVEfmmTrMFb+eewAff/QAAGB8filWPTEBsaIDElRFZMQg5CYOQdGzbZmRvPoYz9dZ2/2MGaLH0Z8m4ZWC4xNUREQD8s6QaWeuLYGzrRHiQCu8+NA63DmV3d5Ieg5CTMAhJ4/CZBvwxpwT7yusBADqNGs+nJ+Hn4/tDLpdJXB0RdVdR24JnPy1E8VkjZDJgUdowzL9zCP9WSVIMQk7CIORaekMblm89jv93oAoA4O8nxzO3DcYztw9CoEopcXVEdDVtJjP+8E0xPt9bCQC4fVg/vPPgOIQFqSSujHwVg5CTMAi5RmuHGWt2nsbqHT+g1WQGAPx8fH88f9dwxGh5zQGRp/jfwjN46csjaO+0oH9oAFbNnoBxcaFSl0U+iEHISRiE+pbFIvCPQ1VYvqUU5wxtAICJCWFY+rNkvnkSeahj54x49u+FKK9tgZ9ChmU/S8ajUxIgk3GqjFyHQchJGIT6TuGPdfivnGM41LV/Uf/QALxwdxJ+NiaGb5hEHs7YZsLzGw5jS7EeAPDv42KRfd9oTnGTyzAIOQmDkPOdqW/BG5uPI6drx/gglQK/vnMI5k1PZFNEIi8ihMD/fF+G7M3HYbYIDI0KxoePTsSQqGCpSyMfwCDkJAxCztPU3okPvzuFj/5Vho5OC2Qy4IGJcfhd+jBEhfhLXR4R9ZF95XXI/PQAahrbEaRS4M3/GIOfjYmVuizycgxCTsIgdPPMFoH/KzyDFdtKcb6xHQAwZVA4lv4sGSNjtRJXR0SucL6xHb/9/CDyT9cCYDdq6nsMQk7CIHRz8n+oxR9zSlByzggASIgIxIv3jMDMZB2vAyLyMexGTa7EIOQkDEI3pvxCM17fdAzbSqoBACH+Svz2J0Px+NQEqJW8DojIl7EbNbkCg5CTMAj1jqHVhPe3n8Ta3eUwmQUUchkemRyPhWlDERGslro8InITFbUt+PVnhThaZe1GvXDGMPzmJ+xGTc7DIOQkDEI902m24PN9lfhz7gnUNXcAAG4b1g+/zxiBYboQiasjInfEbtTUlxiEnIRB6Pp2nDiP1zaW4ER1EwBgSFQwXsoYgTuHR0lcGRF5gv8tPIPff3UEbSZ2oybnYRByEgahqztV04jXNh7Dt6XnAQChgX5YlDYMj6TEw0/BlSBE1HPHzhnx608PoOxCM7tRk1MwCDkJg9Dl6ps78M4/T+DvBRUwWwSUchnmTB2I3/5kKLSBflKXR0Qe6tJu1EOigpEQHoj+YQGIDQ1A/9AA9A8LwIDQAEQGq3k9EV0Tg5CTMAhd1NFpwd/2/Ih3/3kCxrZOAEDaCB1evCcJg/qxUywR3bxLu1FfjUohR0yoP/qHOoak/l1fx4T6c4Wqj2MQusSqVauwYsUK6PV6jB07Fu+99x4mT5583Z9jELK+MeUdq8Frm46h7EIzACApOgRLf5aMaUMiJa6OiLyR3tCG0upGVNW3oqqhBVX1rTjb0IaqhlbojW3XDEk2USFqa0jqOovUPTDFhgZAG8Az2N6sN5/fXr8D3rp165CVlYXVq1cjJSUF77zzDtLT01FaWoqoKF7Qa9NptqDVZEaryYy2DuvXtU3tWPXdKew6Ze0GGxmswu9mDscDk+Kg4GlpIuoj0Vp/RGuvvPVOp9kCvbGtKxi1dIWlVlQ1tKGqvgVVDa1oM1lQ09iOmsZ2FHVt7HypELXSfhYpttsZpdjQAAwIC0A/Tr/5DK8/I5SSkoJbbrkF77//PgDAYrEgLi4Ov/nNb/DCCy9c82fd5YyQ2SLQZjKjpcOMtq6w0trh+H1Lhy3EXPy+zTau63+tj9GJVpPl4rGOTrSZLOgwW676/CqlHPOmJ+LXdwxGiD//FUVE7ksIgbrmDntQOmM/m2QNSVX1rahvMV33cfwUMsRoL592s33N6Tf3xjNCXTo6OlBYWIglS5bY75PL5UhLS0N+fv5l49vb29He3m7/3mg09kld1cY2fPjdDw4hpu0K4cZ2rKPz6iHF2WQyIMBPgUCVAv5+CkxMCMN/zhyOuPBAl9VARHSjZDIZIoLViAhWY/SAK+9n2NLRibMNrTjTdTbpbFdAsn7dhnOGVpjMAhV1Laioa7nqc6mUcshlgEImg1wmg0wGKOTWr+VyGeQyWL+WySCXX3mcTCaDQt5tnO1nun7eYdwlxy5+ffGYw+PJZbjaOa2rLci72k9cffzVHr/nZ9P6haiReeeQHo93Nq8OQhcuXIDZbIZOp3O4X6fT4fjx45eNz87Oxh/+8Ic+r6upvRNrd5ff0M8G+CkQoFI4/u+l913t/mv9b9fXaqWcS1aJyKsFqpQYEhWCIVFXbvhqm36rqm/FWcPFkGQ9u9Rqn35z5T9SvdmgfkEMQu5iyZIlyMrKsn9vNBoRFxfn9OeJDFIj887BCPCznnUJVCkRoJI7fu+nsN5n+9pPAX8/hhQior6mVMgxICwQA8KufCZcCIH6FhNaTWZYLAIWIWC2CFiE9ZhZCFgsgEWIrpv1Egdxydfmru8tQnQ9ziXjRNc4y+Xj7I9tETB3Pa+1DnS7/+pXvlzrophrXi9zrce8sR+TvJu4VwehyMhIKBQKVFdXO9xfXV2N6Ojoy8ar1Wqo1X2/J5Y20A/PpSf1+fMQEZHzyWQyhHMrEK/h1S2AVSoVJk6ciLy8PPt9FosFeXl5SE1NlbAyIiIicgdefUYIALKysjBnzhxMmjQJkydPxjvvvIPm5mbMnTtX6tKIiIhIYl4fhB588EGcP38ey5Ytg16vx7hx47Bly5bLLqAmIiIi3+P1fYRuhrv0ESIiIqKe683nt1dfI0RERER0LQxCRERE5LMYhIiIiMhnMQgRERGRz2IQIiIiIp/FIEREREQ+i0GIiIiIfBaDEBEREfksBiEiIiLyWV6/xcbNsDXdNhqNEldCREREPWX73O7J5hkMQtfQ2NgIAIiLi5O4EiIiIuqtxsZGaLXaa47hXmPXYLFYcPbsWYSEhEAmkzn1sY1GI+Li4lBZWcl9zG4Cf4/Owd+jc/D36Bz8PTqHL/8ehRBobGxEbGws5PJrXwXEM0LXIJfLMWDAgD59Do1G43P/gfYF/h6dg79H5+Dv0Tn4e3QOX/09Xu9MkA0vliYiIiKfxSBEREREPotBSCJqtRovv/wy1Gq11KV4NP4enYO/R+fg79E5+Ht0Dv4ee4YXSxMREZHP4hkhIiIi8lkMQkREROSzGISIiIjIZzEIERERkc9iEJLAqlWrMHDgQPj7+yMlJQV79+6VuiSPk52djVtuuQUhISGIiorCrFmzUFpaKnVZHu2NN96ATCbDwoULpS7F41RVVeHRRx9FREQEAgICMHr0aOzfv1/qsjyK2WzG0qVLkZiYiICAAAwePBh//OMfe7RXlK/buXMn7r33XsTGxkImk+Grr75yOC6EwLJlyxATE4OAgACkpaXh5MmT0hTrhhiEXGzdunXIysrCyy+/jAMHDmDs2LFIT09HTU2N1KV5lB07diAzMxN79uxBbm4uTCYTZs6ciebmZqlL80j79u3DX/7yF4wZM0bqUjxOfX09pk2bBj8/P2zevBklJSV46623EBYWJnVpHuXNN9/Ehx9+iPfffx/Hjh3Dm2++ieXLl+O9996TujS319zcjLFjx2LVqlVXPL58+XKsXLkSq1evRkFBAYKCgpCeno62tjYXV+qmBLnU5MmTRWZmpv17s9ksYmNjRXZ2toRVeb6amhoBQOzYsUPqUjxOY2OjGDp0qMjNzRW33367WLBggdQleZTFixeL6dOnS12Gx8vIyBBPPvmkw3333XefmD17tkQVeSYA4ssvv7R/b7FYRHR0tFixYoX9voaGBqFWq8Xnn38uQYXuh2eEXKijowOFhYVIS0uz3yeXy5GWlob8/HwJK/N8BoMBABAeHi5xJZ4nMzMTGRkZDv9dUs99/fXXmDRpEu6//35ERUVh/Pjx+Oijj6Quy+NMnToVeXl5OHHiBADg0KFD+P7773H33XdLXJlnKysrg16vd/j71mq1SElJ4edOF2666kIXLlyA2WyGTqdzuF+n0+H48eMSVeX5LBYLFi5ciGnTpmHUqFFSl+NRvvjiCxw4cAD79u2TuhSPdfr0aXz44YfIysrCiy++iH379uG3v/0tVCoV5syZI3V5HuOFF16A0WhEUlISFAoFzGYzXnvtNcyePVvq0jyaXq8HgCt+7tiO+ToGIfJ4mZmZOHr0KL7//nupS/EolZWVWLBgAXJzc+Hv7y91OR7LYrFg0qRJeP311wEA48ePx9GjR7F69WoGoV5Yv349Pv30U3z22WcYOXIkioqKsHDhQsTGxvL3SH2KU2MuFBkZCYVCgerqaof7q6urER0dLVFVnm3+/PnIycnBt99+iwEDBkhdjkcpLCxETU0NJkyYAKVSCaVSiR07dmDlypVQKpUwm81Sl+gRYmJikJyc7HDfiBEjUFFRIVFFnum5557DCy+8gIceegijR4/GY489hkWLFiE7O1vq0jya7bOFnztXxyDkQiqVChMnTkReXp79PovFgry8PKSmpkpYmecRQmD+/Pn48ssvsX37diQmJkpdkseZMWMGjhw5gqKiIvtt0qRJmD17NoqKiqBQKKQu0SNMmzbtstYNJ06cQEJCgkQVeaaWlhbI5Y4fSQqFAhaLRaKKvENiYiKio6MdPneMRiMKCgr4udOFU2MulpWVhTlz5mDSpEmYPHky3nnnHTQ3N2Pu3LlSl+ZRMjMz8dlnn+Ef//gHQkJC7HPdWq0WAQEBElfnGUJCQi67piooKAgRERG81qoXFi1ahKlTp+L111/HAw88gL1792LNmjVYs2aN1KV5lHvvvRevvfYa4uPjMXLkSBw8eBBvv/02nnzySalLc3tNTU04deqU/fuysjIUFRUhPDwc8fHxWLhwIV599VUMHToUiYmJWLp0KWJjYzFr1izpinYnUi9b80XvvfeeiI+PFyqVSkyePFns2bNH6pI8DoAr3j7++GOpS/NoXD5/Y7755hsxatQooVarRVJSklizZo3UJXkco9EoFixYIOLj44W/v78YNGiQeOmll0R7e7vUpbm9b7/99orvh3PmzBFCWJfQL126VOh0OqFWq8WMGTNEaWmptEW7EZkQbNtJREREvonXCBEREZHPYhAiIiIin8UgRERERD6LQYiIiIh8FoMQERER+SwGISIiIvJZDEJERETksxiEiIiIyGcxCBEREZHPYhAiIiIin8UgRERERD6LQYiIiIh81v8PNj08GNGGGZYAAAAASUVORK5CYII=",
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "plt.plot(cost_bin_gp.ct)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9Z1wBbKLQXqD"
      },
      "source": [
        "# 报童"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "id": "OYfTcLgHQXqD"
      },
      "outputs": [],
      "source": [
        "def need():\n",
        "    return np.random.randint(50, 100)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "id": "xdcyDO7FQXqE"
      },
      "outputs": [],
      "source": [
        "def profit(need, repo):\n",
        "    if repo > need:\n",
        "        remain = repo - need\n",
        "        sell = need\n",
        "        profit_ = sell * 1.5 + remain * (-0.5)\n",
        "    elif repo <= need:\n",
        "        sell = repo\n",
        "        profit_ = sell * 1.5\n",
        "    return profit_"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "UIirM3MTQXqE",
        "outputId": "43bf358f-19b5-4d1a-a30a-885cab6a32fc"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "90.0\n",
            "70.0\n",
            "90.0\n",
            "95.0\n",
            "65.0\n",
            "105.0\n",
            "70.0\n",
            "100.0\n",
            "120.0\n"
          ]
        }
      ],
      "source": [
        "print(profit(need=60 , repo=60))\n",
        "print(profit(need=50 , repo=60))\n",
        "print(profit(need=80 , repo=60))\n",
        "print(profit(need=65 , repo=70))\n",
        "print(profit(need=50 , repo=70))\n",
        "print(profit(need=88 , repo=70))\n",
        "print(profit(need=55 , repo=80))\n",
        "print(profit(need=70 , repo=80))\n",
        "print(profit(need=90 , repo=80))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# 作业 关键路径分析"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {},
      "outputs": [],
      "source": [
        "import pandas as pd\n",
        "import numpy as np"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 求各活动的beta分布参数"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 98,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>mu</th>\n",
              "      <th>variance</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>2.0</td>\n",
              "      <td>0.111111</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>4.0</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>10.0</td>\n",
              "      <td>4.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>6.0</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>4.0</td>\n",
              "      <td>0.444444</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>5.0</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>7.0</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>9.0</td>\n",
              "      <td>4.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>7.0</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>8.0</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>4.0</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>5.0</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>2.0</td>\n",
              "      <td>0.111111</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>6.0</td>\n",
              "      <td>0.444444</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "      mu  variance\n",
              "0    2.0  0.111111\n",
              "1    4.0  1.000000\n",
              "2   10.0  4.000000\n",
              "3    6.0  1.000000\n",
              "4    4.0  0.444444\n",
              "5    5.0  1.000000\n",
              "6    7.0  1.000000\n",
              "7    9.0  4.000000\n",
              "8    7.0  1.000000\n",
              "9    8.0  1.000000\n",
              "10   4.0  0.000000\n",
              "11   5.0  1.000000\n",
              "12   2.0  0.111111\n",
              "13   6.0  0.444444"
            ]
          },
          "execution_count": 98,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "omp=pd.DataFrame([\n",
        "    [1,\t2\t,3],\n",
        "    [2,\t3.5\t,8],\n",
        "    [6,\t9\t,18],\n",
        "    [4,\t5.5\t,10],\n",
        "    [1,\t4.5\t,5],\n",
        "    [4,\t4\t,10],\n",
        "    [5,\t6.5\t,11],\n",
        "    [5,\t8\t,17],\n",
        "    [3,\t7.5\t,9],\n",
        "    [3,\t9\t,9],\n",
        "    [4,\t4\t,4],\n",
        "    [1,\t5.5\t,7],\n",
        "    [1,\t2\t,3],\n",
        "    [5,\t5.5\t,9]\n",
        "], columns=['o', 'm', 'p'])\n",
        "# 均值方差\n",
        "mu = omp.apply(lambda x: (x.o + 4*x.m + x.p)/6, axis=1)\n",
        "variance = omp.apply(lambda x: (x.p-x.o)**2/36, axis=1)\n",
        "mean_variance = pd.DataFrame({\"mu\": mu, \"variance\": variance})\n",
        "mean_variance"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 99,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>mu</th>\n",
              "      <th>variance</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.10</td>\n",
              "      <td>0.000278</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.20</td>\n",
              "      <td>0.002500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.50</td>\n",
              "      <td>0.010000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.30</td>\n",
              "      <td>0.002500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.20</td>\n",
              "      <td>0.001111</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>0.25</td>\n",
              "      <td>0.002500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>0.35</td>\n",
              "      <td>0.002500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>0.45</td>\n",
              "      <td>0.010000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>0.35</td>\n",
              "      <td>0.002500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>0.40</td>\n",
              "      <td>0.002500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>0.20</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>0.25</td>\n",
              "      <td>0.002500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>0.10</td>\n",
              "      <td>0.000278</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>0.30</td>\n",
              "      <td>0.001111</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "      mu  variance\n",
              "0   0.10  0.000278\n",
              "1   0.20  0.002500\n",
              "2   0.50  0.010000\n",
              "3   0.30  0.002500\n",
              "4   0.20  0.001111\n",
              "5   0.25  0.002500\n",
              "6   0.35  0.002500\n",
              "7   0.45  0.010000\n",
              "8   0.35  0.002500\n",
              "9   0.40  0.002500\n",
              "10  0.20  0.000000\n",
              "11  0.25  0.002500\n",
              "12  0.10  0.000278\n",
              "13  0.30  0.001111"
            ]
          },
          "execution_count": 99,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "mean_variance.mu = mean_variance.mu / 20.0\n",
        "mean_variance.variance = mean_variance.variance / 400.0\n",
        "mean_variance"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 100,
      "metadata": {},
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/Users/tzp/opt/miniconda3/envs/mlflow-dev-env/lib/python3.7/site-packages/ipykernel_launcher.py:3: RuntimeWarning: divide by zero encountered in double_scalars\n",
            "  This is separate from the ipykernel package so we can avoid doing imports until\n"
          ]
        },
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>a</th>\n",
              "      <th>b</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>32.3000</td>\n",
              "      <td>290.7000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>12.6000</td>\n",
              "      <td>50.4000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>12.0000</td>\n",
              "      <td>12.0000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>24.9000</td>\n",
              "      <td>58.1000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>28.6000</td>\n",
              "      <td>114.4000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>18.5000</td>\n",
              "      <td>55.5000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>31.5000</td>\n",
              "      <td>58.5000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>10.6875</td>\n",
              "      <td>13.0625</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>31.5000</td>\n",
              "      <td>58.5000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>38.0000</td>\n",
              "      <td>57.0000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>inf</td>\n",
              "      <td>inf</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>18.5000</td>\n",
              "      <td>55.5000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>32.3000</td>\n",
              "      <td>290.7000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>56.4000</td>\n",
              "      <td>131.6000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "          a         b\n",
              "0   32.3000  290.7000\n",
              "1   12.6000   50.4000\n",
              "2   12.0000   12.0000\n",
              "3   24.9000   58.1000\n",
              "4   28.6000  114.4000\n",
              "5   18.5000   55.5000\n",
              "6   31.5000   58.5000\n",
              "7   10.6875   13.0625\n",
              "8   31.5000   58.5000\n",
              "9   38.0000   57.0000\n",
              "10      inf       inf\n",
              "11  18.5000   55.5000\n",
              "12  32.3000  290.7000\n",
              "13  56.4000  131.6000"
            ]
          },
          "execution_count": 100,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# 根据均值方差, 求β分布的两个参数\n",
        "def getAlphaBeta(mu, variance):\n",
        "    alpha = mu**2 * ((1 - mu) / variance - 1 / mu)\n",
        "    beta = alpha * (1 / mu - 1)\n",
        "    return alpha, beta\n",
        "\n",
        "x = mean_variance.apply(lambda x: getAlphaBeta(x.mu, x.variance), axis=1)\n",
        "alpha_beta = pd.DataFrame({'a':[i[0] for i in x], 'b': [i[1] for i in x]})\n",
        "alpha_beta"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 随机生成数据"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 129,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[1.8983961247316197,\n",
              " 4.033290758042435,\n",
              " 11.559160938734895,\n",
              " 7.201042509815084,\n",
              " 2.962359008396709,\n",
              " 4.380159426288069,\n",
              " 6.381026668515645,\n",
              " 12.152237521315515,\n",
              " 6.539290128820994,\n",
              " 8.690388336814632,\n",
              " 4.0,\n",
              " 4.907129383523049,\n",
              " 2.2436802085312717,\n",
              " 6.0708731428464855]"
            ]
          },
          "execution_count": 129,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# 有一个活动时间,均值4方差0, 认为是固定长度.\n",
        "def rand_beta():\n",
        "    return [ np.random.beta(row.a, row.b) * 20 if not np.isinf(row.a) else 4.0 for row in alpha_beta.itertuples()]\n",
        "\n",
        "rand_beta()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 168,
      "metadata": {},
      "outputs": [],
      "source": [
        "m = 100000\n",
        "result = [rand_beta() for i in range(0, m)]\n",
        "data = np.array(result)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 所有路径的工时之和取max"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 169,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 一共六条路径, 数组存放各路径经过的节点的index\n",
        "paths = [\n",
        "    [0,1,2,3,6,7,12],\n",
        "    [0,1,2,3,6,7,12],\n",
        "    [0,1,2,4,5,9,10,13],\n",
        "    [0,1,2,4,5,9,11,13],\n",
        "    [0,1,2,8,9,10,13],\n",
        "    [0,1,2,8,9,11,13]\n",
        "]\n",
        "def max_path_time(activties):\n",
        "    times = []\n",
        "    for path in paths:\n",
        "        times.append(sum([activties[pi] for pi in path]))\n",
        "    max_index = np.argmax(times)\n",
        "    max = np.max(times)\n",
        "    return max, max_index\n",
        "\n",
        "max_infos = pd.DataFrame([max_path_time(data[i]) for i in range(0, m)], columns=['max_time', 'max_index'])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 170,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "总工期均值 44.28032076073607, 方差 8.303787916540488, 标准差 2.8816293857018613\n"
          ]
        }
      ],
      "source": [
        "max_time_mean = max_infos.max_time.mean()\n",
        "max_time_var = max_infos.max_time.var()\n",
        "print(f\"总工期均值 {max_time_mean}, 方差 {max_time_var}, 标准差 {max_time_var**0.5}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 直方图 "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 171,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxUAAAGGCAYAAAANcKzOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA040lEQVR4nO3deVRV9d7H8c9BYnDgkANTonLTVBzyKoVUViZJQT6Z9hRFN0zKW0HXIUtd5dQE0pOpdZVsELvptSzrqbxpiNO9RWoaoZZmg1N6wEI4SldEOM8fXfbjCXNgHzznwPu11lmL/du/s/d3s9d2+eG3f3tbHA6HQwAAAABQTz7uLgAAAACAdyNUAAAAADCFUAEAAADAFEIFAAAAAFMIFQAAAABMIVQAAAAAMIVQAQAAAMAUQgUAAAAAUwgVAAAAAEwhVAAAGrW1a9fKYrFo7dq17i4FABotQgUAoFGYO3eucnNz3V0GADRJFofD4XB3EQAAmNWzZ0+1bdu2zohETU2Njh8/Lj8/P/n48Lc0AGgIvu4uAACAhuTj46OAgAB3lwEAjRp/sgEAnNK0adNksVj0zTff6K677pLValW7du00efJkORwO7du3TzfffLOCgoIUFham5557zvju8ePHNWXKFPXr109Wq1UtWrTQgAEDtGbNGqd9TJ06VT4+PsrPz3dqHzVqlPz8/PTll1+eVa2dOnXS9u3btW7dOlksFlksFl177bWSTj2n4tprr1XPnj1VVFSka665Rs2bN1fnzp319ttvS5LWrVun2NhYBQYGqmvXrlq1alWdff74448aOXKkQkND5e/vrx49eui11147q3oBoLEhVAAATuv2229XTU2NsrKyFBsbq6eeekqzZs3S9ddfr4suukgzZsxQ586dNX78eK1fv16SZLfb9corr+jaa6/VjBkzNG3aNB06dEgJCQkqLCw0tv3444+rT58+SktL05EjRyRJK1eu1Msvv6wpU6bo0ksvPasaZ82apfbt26tbt27629/+pr/97W967LHHTvudw4cP66abblJsbKyys7Pl7++v5ORkvfnmm0pOTlZiYqKysrJUUVGhW2+91ahPkoqLi9W/f3+tWrVKGRkZmj17tjp37qy0tDTNmjXr3H7BANAYOAAAOIWpU6c6JDlGjRpltJ04ccLRvn17h8VicWRlZRnthw8fdgQGBjpS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1KhRWrx4sSTJbrdr8ODBio+PV05OjrZu3aqRI0cqODhYo0aNcsmxAAAAAI2VxeFwOFyxoV27dumBBx7QI488ooSEBFdsUhMnTtQnn3yif/7zn6dc73A4FBERoYcffljjx4+XJJWXlys0NFS5ublKTk7W119/rejoaG3atEkxMTGSpBUrVigxMVH79+9XRESE5s2bp8cee0w2m81498bEiRP13nvvaceOHWdVq91ul9VqVXl5uYKCglxw9AAak04Tl7u7BDQiu7OS3F0CADip1+1Pp9KlSxdlZWXVGcUw4/3331dMTIz++7//WyEhIfrjH/+ol19+2Vj/ww8/yGazKT4+3mizWq2KjY1VQUGBJKmgoEDBwcFGoJCk+Ph4+fj4aMOGDUafq6++2ullfgkJCdq5c6cOHz58ytoqKytlt9udPgAAAEBT5LJQIf06efvAgQMu297333+vefPmqUuXLlq5cqUeeOAB/eUvf9HChQslSTabTZIUGhrq9L3Q0FBjnc1mU0hISJ06W7du7dTnVNs4eR+/lZmZKavVanwiIyNNHi0AAADgneo1p+L99993WnY4HDp48KBefPFFXXnllS4pTPr1zd0xMTF65plnJEl//OMftW3bNuXk5Cg1NdVl+6mPSZMmady4ccay3W4nWAAAAKBJqleoGDp0qNOyxWJRu3btdN111+m5555zRV2SpPDwcEVHRzu1de/eXe+8844kKSwsTJJUXFys8PBwo09xcbH69Olj9CkpKXHaxokTJ1RaWmp8PywsTMXFxU59apdr+/yWv7+//P3963lkADwZ8x8AADg39br9qaamxulTXV0tm82mxYsXO/3n3qwrr7xSO3fudGr75ptv1LFjR0lSVFSUwsLClJ+fb6y32+3asGGD4uLiJElxcXEqKyvT5s2bjT6rV69WTU2NYmNjjT7r169XVVWV0ScvL09du3Z1etIUAAAAgLpc9vSnhrBp0yZdccUVmj59um677TZt3LhR9913n+bPn6+UlBRJ0owZM5SVleX0SNmioiKnR8reeOONKi4uVk5OjvFI2ZiYGOORsuXl5eratasGDx6sCRMmaNu2bRo5cqSef/75s36kLE9/AhoPRirQFPFEKQBm1Ov2p5PnEpzJzJkz67MLSdJll12md999V5MmTdITTzyhqKgozZo1ywgUkvToo4+qoqJCo0aNUllZma666iqtWLHCCBSStGjRImVkZGjQoEHy8fHR8OHDNWfOHGO91WrVxx9/rPT0dPXr109t27bVlClTeEcFAAAAcBbqNVIxcOBAffHFF6qqqlLXrl0l/XpbUrNmzdS3b9//37jFotWrV7uuWg/GSAXQeDBSgaaIkQoAZtRrpGLIkCFq1aqVFi5caMw5OHz4sO655x4NGDBADz/8sEuLBAAAAOC56jVScdFFF+njjz9Wjx49nNq3bdumwYMHu/RdFd6CkQqg8WCkAk0RIxUAzKjX05/sdrsOHTpUp/3QoUM6cuSI6aIAAAAAeI96hYpbbrlF99xzj5YtW6b9+/dr//79euedd5SWlqZhw4a5ukYAAAAAHqxecypycnI0fvx43Xnnnca7HXx9fZWWlqZnn33WpQUCAAAA8Gym3lNRUVGh7777TpJ08cUXq0WLFi4rzNswpwJoPJhTgaaIORUAzKjX7U+1Dh48qIMHD6pLly5q0aKFPPg9egAAAAAaSL1Cxc8//6xBgwbpkksuUWJiog4ePChJSktL43GyAAAAQBNTr1AxduxYXXDBBdq7d6+aN29utN9+++1asWKFy4oDAAAA4PnqNVH7448/1sqVK9W+fXun9i5dumjPnj0uKQwAAACAd6jXSEVFRYXTCEWt0tJS+fv7my4KAAAAgPeoV6gYMGCAXn/9dWPZYrGopqZG2dnZGjhwoMuKAwAAAOD56nX7U3Z2tgYNGqTPP/9cx48f16OPPqrt27ertLRUn3zyiatrBAAAAODB6jVS0bNnT33zzTe66qqrdPPNN6uiokLDhg3TF198oYsvvtjVNQIAAADwYOc8UlFVVaUbbrhBOTk5euyxxxqiJgAAAABe5JxHKi644AIVFRU1RC0AAAAAvFC9bn+666679Oqrr7q6FgAAAABeqF4TtU+cOKHXXntNq1atUr9+/dSiRQun9TNnznRJcQAAAAA83zmFiu+//16dOnXStm3b1LdvX0nSN99849THYrG4rjoAAAAAHu+cQkWXLl108OBBrVmzRpJ0++23a86cOQoNDW2Q4gAAAAB4vnOaU+FwOJyWP/roI1VUVLi0IAAAAADepV4TtWv9NmQAAAAAaHrOKVRYLJY6cyaYQwEAAAA0bec0p8LhcGjEiBHy9/eXJB07dkz3339/nac/LVu2zHUVAgAAAPBo5xQqUlNTnZbvuusulxYDAAAAwPucU6hYsGBBQ9UBAAAAwEuZmqgNAAAAAIQKAAAAAKYQKgAAAACYQqgAAAAAYAqhAgAAAIAphAoAAAAAphAqAAAAAJhCqAAAAABgCqECAAAAgCmECgAAAACmECoAAAAAmEKoAAAAAGAKoQIAAACAKYQKAAAAAKYQKgAAAACY4lWhIisrSxaLRWPGjDHajh07pvT0dLVp00YtW7bU8OHDVVxc7PS9vXv3KikpSc2bN1dISIgeeeQRnThxwqnP2rVr1bdvX/n7+6tz587Kzc09D0cEAAAAeD+vCRWbNm3SSy+9pN69ezu1jx07Vh988IGWLl2qdevW6cCBAxo2bJixvrq6WklJSTp+/Lg+/fRTLVy4ULm5uZoyZYrR54cfflBSUpIGDhyowsJCjRkzRvfee69Wrlx53o4PAAAA8FYWh8PhcHcRZ3L06FH17dtXc+fO1VNPPaU+ffpo1qxZKi8vV7t27bR48WLdeuutkqQdO3aoe/fuKigoUP/+/fXRRx/ppptu0oEDBxQaGipJysnJ0YQJE3To0CH5+flpwoQJWr58ubZt22bsMzk5WWVlZVqxYsVZ1Wi322W1WlVeXq6goCDX/xIAnDedJi53dwnAebc7K8ndJQDwYl4xUpGenq6kpCTFx8c7tW/evFlVVVVO7d26dVOHDh1UUFAgSSooKFCvXr2MQCFJCQkJstvt2r59u9Hnt9tOSEgwtgEAAADg9/m6u4AzWbJkibZs2aJNmzbVWWez2eTn56fg4GCn9tDQUNlsNqPPyYGidn3tutP1sdvt+ve//63AwMA6+66srFRlZaWxbLfbz/3gAADwEA0xQsfoB9B0ePRIxb59+zR69GgtWrRIAQEB7i7HSWZmpqxWq/GJjIx0d0kAAACAW3j0SMXmzZtVUlKivn37Gm3V1dVav369XnzxRa1cuVLHjx9XWVmZ02hFcXGxwsLCJElhYWHauHGj03Zrnw51cp/fPjGquLhYQUFBpxylkKRJkyZp3LhxxrLdbidYAG7A/AcAANzPo0cqBg0apK1bt6qwsND4xMTEKCUlxfj5ggsuUH5+vvGdnTt3au/evYqLi5MkxcXFaevWrSopKTH65OXlKSgoSNHR0Uafk7dR26d2G6fi7++voKAgpw8AAADQFHn0SEWrVq3Us2dPp7YWLVqoTZs2RntaWprGjRun1q1bKygoSA899JDi4uLUv39/SdLgwYMVHR2tP/3pT8rOzpbNZtPjjz+u9PR0+fv7S5Luv/9+vfjii3r00Uc1cuRIrV69Wm+99ZaWL+cvoAAAAMCZeHSoOBvPP/+8fHx8NHz4cFVWViohIUFz58411jdr1kwffvihHnjgAcXFxalFixZKTU3VE088YfSJiorS8uXLNXbsWM2ePVvt27fXK6+8ooSEBHccEgAAAOBVvOI9Fd6A91QA7sGcCsBz8fQnoOnw6DkVAAAAADwfoQIAAACAKYQKAAAAAKYQKgAAAACYQqgAAAAAYAqhAgAAAIAphAoAAAAAphAqAAAAAJhCqAAAAABgCqECAAAAgCmECgAAAACmECoAAAAAmEKoAAAAAGAKoQIAAACAKYQKAAAAAKYQKgAAAACYQqgAAAAAYAqhAgAAAIAphAoAAAAAphAqAAAAAJhCqAAAAABgCqECAAAAgCmECgAAAACmECoAAAAAmEKoAAAAAGAKoQIAAACAKYQKAAAAAKYQKgAAAACYQqgAAAAAYAqhAgAAAIAphAoAAAAApvi6uwAAANA4dZq43OXb3J2V5PJtAjCPkQoAAAAAphAqAAAAAJhCqAAAAABgCqECAAAAgClM1AZw3jTEpE0AAOB+jFQAAAAAMIVQAQAAAMAUQgUAAAAAUwgVAAAAAEzx6FCRmZmpyy67TK1atVJISIiGDh2qnTt3OvU5duyY0tPT1aZNG7Vs2VLDhw9XcXGxU5+9e/cqKSlJzZs3V0hIiB555BGdOHHCqc/atWvVt29f+fv7q3PnzsrNzW3owwMAAAAaBY8OFevWrVN6ero+++wz5eXlqaqqSoMHD1ZFRYXRZ+zYsfrggw+0dOlSrVu3TgcOHNCwYcOM9dXV1UpKStLx48f16aefauHChcrNzdWUKVOMPj/88IOSkpI0cOBAFRYWasyYMbr33nu1cuXK83q8AAAAgDeyOBwOh7uLOFuHDh1SSEiI1q1bp6uvvlrl5eVq166dFi9erFtvvVWStGPHDnXv3l0FBQXq37+/PvroI9100006cOCAQkNDJUk5OTmaMGGCDh06JD8/P02YMEHLly/Xtm3bjH0lJyerrKxMK1asOKva7Ha7rFarysvLFRQU5PqDBxoBHikLwKzdWUnuLgHAKXj0SMVvlZeXS5Jat24tSdq8ebOqqqoUHx9v9OnWrZs6dOiggoICSVJBQYF69eplBApJSkhIkN1u1/bt240+J2+jtk/tNgAAAAD8Pq95+V1NTY3GjBmjK6+8Uj179pQk2Ww2+fn5KTg42KlvaGiobDab0efkQFG7vnbd6frY7Xb9+9//VmBgYJ16KisrVVlZaSzb7XZzBwgAAAB4Ka8ZqUhPT9e2bdu0ZMkSd5ci6ddJ5Far1fhERka6uyQAAADALbwiVGRkZOjDDz/UmjVr1L59e6M9LCxMx48fV1lZmVP/4uJihYWFGX1++zSo2uUz9QkKCjrlKIUkTZo0SeXl5cZn3759po4RAAAA8FYeHSocDocyMjL07rvvavXq1YqKinJa369fP11wwQXKz8832nbu3Km9e/cqLi5OkhQXF6etW7eqpKTE6JOXl6egoCBFR0cbfU7eRm2f2m2cir+/v4KCgpw+AAAAQFPk0XMq0tPTtXjxYv3v//6vWrVqZcyBsFqtCgwMlNVqVVpamsaNG6fWrVsrKChIDz30kOLi4tS/f39J0uDBgxUdHa0//elPys7Ols1m0+OPP6709HT5+/tLku6//369+OKLevTRRzVy5EitXr1ab731lpYv50k1AAAAwJl49CNlLRbLKdsXLFigESNGSPr15XcPP/yw/v73v6uyslIJCQmaO3eucWuTJO3Zs0cPPPCA1q5dqxYtWig1NVVZWVny9f3/TLV27VqNHTtWX331ldq3b6/Jkycb+zgbPFIWODMeKQvALB4pC3gmjw4V3oRQAZwZoQKAWYQKwDN59JwKAAAAAJ6PUAEAAADAFEIFAAAAAFMIFQAAAABMIVQAAAAAMIVQAQAAAMAUQgUAAAAAUwgVAAAAAEwhVAAAAAAwxdfdBQAAAJytThOXu3ybvKUbMI+RCgAAAACmECoAAAAAmEKoAAAAAGAKcyoAnFJD3LcMAAAaJ0YqAAAAAJhCqAAAAABgCqECAAAAgCmECgAAAACmECoAAAAAmEKoAAAAAGAKoQIAAACAKYQKAAAAAKYQKgAAAACYQqgAAAAAYAqhAgAAAIAphAoAAAAApvi6uwAAAAB36jRxeYNsd3dWUoNsF/BEjFQAAAAAMIVQAQAAAMAUbn8CGoGGGroHAAA4G4xUAAAAADCFUAEAAADAFEIFAAAAAFMIFQAAAABMIVQAAAAAMIVQAQAAAMAUQgUAAAAAU3hPBQAAQANoiHcI7c5Kcvk2AVdgpAIAAACAKYxUAOcRb74GAACNESMVAAAAAEwhVAAAAAAwhduffuOvf/2rnn32WdlsNl166aV64YUXdPnll7u7LAAAACZ/w2MxUnGSN998U+PGjdPUqVO1ZcsWXXrppUpISFBJSYm7SwMAAAA8lsXhcDjcXYSniI2N1WWXXaYXX3xRklRTU6PIyEg99NBDmjhx4mm/a7fbZbVaVV5erqCgoPNRLhoYk6oBAKgfRj+aHm5/+o/jx49r8+bNmjRpktHm4+Oj+Ph4FRQU1OlfWVmpyspKY7m8vFzSr+EC51/PqSvdXQIAAPiPDmOXunyb26YnuHybOHutWrWSxWL53fWEiv/46aefVF1drdDQUKf20NBQ7dixo07/zMxMTZ8+vU57ZGRkg9UIAADQVFlnubuCpu1Md+MQKupp0qRJGjdunLFcU1Oj0tJStWnT5rQpDp7HbrcrMjJS+/bt49a1Ro5z3XRwrpsGznPTwbl2v1atWp12PaHiP9q2batmzZqpuLjYqb24uFhhYWF1+vv7+8vf39+pLTg4uCFLRAMLCgriH6omgnPddHCumwbOc9PBufZcPP3pP/z8/NSvXz/l5+cbbTU1NcrPz1dcXJwbKwMAAAA8GyMVJxk3bpxSU1MVExOjyy+/XLNmzVJFRYXuueced5cGAAAAeCxCxUluv/12HTp0SFOmTJHNZlOfPn20YsWKOpO30bj4+/tr6tSpdW5nQ+PDuW46ONdNA+e56eBcez7eUwEAAADAFOZUAAAAADCFUAEAAADAFEIFAAAAAFMIFQAAAABMIVSgSZg3b5569+5tvDQnLi5OH330kbH+2muvlcVicfrcf//9bqwYrpKVlSWLxaIxY8YYbceOHVN6erratGmjli1bavjw4XVefAnvcqrzzHXdeEybNq3OuezWrZuxnmu6cTjTeeaa9mw8UhZNQvv27ZWVlaUuXbrI4XBo4cKFuvnmm/XFF1+oR48ekqT77rtPTzzxhPGd5s2bu6tcuMimTZv00ksvqXfv3k7tY8eO1fLly7V06VJZrVZlZGRo2LBh+uSTT9xUKcz4vfMscV03Jj169NCqVauMZV/f//8vDNd043G68yxxTXsyQgWahCFDhjgtP/3005o3b54+++wzI1Q0b95cYWFh7igPDeDo0aNKSUnRyy+/rKeeespoLy8v16uvvqrFixfruuuukyQtWLBA3bt312effab+/fu7q2TUw++d51pc142Hr6/vKc8l13Tj8nvnuRbXtOfi9ic0OdXV1VqyZIkqKioUFxdntC9atEht27ZVz549NWnSJP3yyy9urBJmpaenKykpSfHx8U7tmzdvVlVVlVN7t27d1KFDBxUUFJzvMmHS753nWlzXjceuXbsUERGhP/zhD0pJSdHevXslcU03Nr93nmtxTXsuRirQZGzdulVxcXE6duyYWrZsqXfffVfR0dGSpDvvvFMdO3ZURESEioqKNGHCBO3cuVPLli1zc9WojyVLlmjLli3atGlTnXU2m01+fn4KDg52ag8NDZXNZjtPFcIVTneeJa7rxiQ2Nla5ubnq2rWrDh48qOnTp2vAgAHatm0b13Qjcrrz3KpVK65pD0eoQJPRtWtXFRYWqry8XG+//bZSU1O1bt06RUdHa9SoUUa/Xr16KTw8XIMGDdJ3332niy++2I1V41zt27dPo0ePVl5engICAtxdDhrI2ZxnruvG48YbbzR+7t27t2JjY9WxY0e99dZbCgwMdGNlcKXTnee0tDSuaQ/H7U9oMvz8/NS5c2f169dPmZmZuvTSSzV79uxT9o2NjZUkffvtt+ezRLjA5s2bVVJSor59+8rX11e+vr5at26d5syZI19fX4WGhur48eMqKytz+l5xcTH36XqRM53n6urqOt/hum48goODdckll+jbb79VWFgY13QjdfJ5PhWuac9CqECTVVNTo8rKylOuKywslCSFh4efx4rgCoMGDdLWrVtVWFhofGJiYpSSkmL8fMEFFyg/P9/4zs6dO7V3716nOTbwbGc6z82aNavzHa7rxuPo0aP67rvvFB4ern79+nFNN1Inn+dT4Zr2LNz+hCZh0qRJuvHGG9WhQwcdOXJEixcv1tq1a7Vy5Up99913Wrx4sRITE9WmTRsVFRVp7Nixuvrqq0/5iEp4tlatWqlnz55ObS1atFCbNm2M9rS0NI0bN06tW7dWUFCQHnroIcXFxfGUGC9ypvPMdd24jB8/XkOGDFHHjh114MABTZ06Vc2aNdMdd9whq9XKNd1InO48c017PkIFmoSSkhLdfffdOnjwoKxWq3r37q2VK1fq+uuv1759+7Rq1SrNmjVLFRUVioyM1PDhw/X444+7u2w0kOeff14+Pj4aPny4KisrlZCQoLlz57q7LLiQn58f13Ujsn//ft1xxx36+eef1a5dO1111VX67LPP1K5dO0lc043F6c7zsWPHuKY9nMXhcDjcXQQAAAAA78WcCgAAAACmECoAAAAAmEKoAAAAAGAKoQIAAACAKYQKAAAAAKYQKgAAAACYQqgAAAAAYAqhAgAAAIAphAoAAAAAphAqAAAAAJhCqAAAAABgCqECAAAAgCn/B3gJiToZk2fFAAAAAElFTkSuQmCC",
            "text/plain": [
              "<Figure size 800x400 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "def histogram(df, colname, num_bins=30, figscale=1):\n",
        "  df[colname].plot(kind='hist', bins=num_bins, title=colname, figsize=(8*figscale, 4*figscale))\n",
        "  plt.gca().spines[['top', 'right',]].set_visible(False)\n",
        "  plt.tight_layout()\n",
        "\n",
        "chart = histogram(max_infos, *['max_time'], **{})\n",
        "chart"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 完工概率与工期估计"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "总工期服从正态分布, 根据查表\n",
        "\n",
        "- 95概率对应1.65个标准差\n",
        "- 99概率对应2.33个标准差\n",
        " \n",
        "总工期均值 44.28032076073607, 方差 8.303787916540488, 标准差 2.8816293857018613"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 172,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "49.03500924714414"
            ]
          },
          "execution_count": 172,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# 以95%概率完工的最短工期为49.06天\n",
        "max_time_mean + max_time_var**0.5 * 1.65"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 173,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "50.994517229421405"
            ]
          },
          "execution_count": 173,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# 以99%概率完工的最短工期为51.03天\n",
        "max_time_mean + max_time_var**0.5 * 2.33"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [
        "9Z1wBbKLQXqD"
      ],
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "mlflow-dev-env",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.13"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
